#!/usr/bin/env python
# -*-coding:UTF-8 -*-
'''
@Project ：爬虫-波波老师
@File：28-协程.py
@Author ：文非
@Date：2021/3/1419:52
@Require：
'''

import asyncio

# 在一个函数前面加 asyncio关键字 就会返回一个协程对象
async def request(url):
    print("正在请求的url是", url)
    print("请求成功", url)
    return url

# async修饰的函数，调用之后返回的一个协程对象
c = request("www.baidu.com") # 行为对象

# 创建一个事件的循环对象
# loop = asyncio.get_event_loop()
# # 将协程对象注册到一个事件循环中,然后启动事件循环loop
# loop.run_until_complete(c)  # loop循环对象的这个方法既可以实现协程对象的注册又可以实现事件循环的启动
# print(task)


# # 将协程对象封装到任务对象task中
# loop = asyncio.get_event_loop()  # 创建一个事件循环
#
# # 基于协程对象创建一个任务对象并且将协程对象封装到了任务对象中
# task= loop.create_task(c) # 协程对象的create_task()方法创建task对象
# print(task)
#
# # 将task任务对象注册到一个事件循环中，并启动事件循环loop
# loop.run_until_complete(task)
# print(task)

# future的使用
# loop = asyncio.get_event_loop()
# task=asyncio.ensure_future(c)
# print(task)
# loop.run_until_complete(task)
# print(task)

# 回调绑定 事件绑定
#
def callback(task):
    # result 返回的是任务对象中封装的协程对象对应函数的返回值
    print(task.result()) # 在回调函数中用result()函数返回协程对象的返回值


loop = asyncio.get_event_loop()
task =asyncio.ensure_future(c)
# 将回调函数绑定到任务对象中
task.add_done_callback(callback)
loop.run_until_complete(task)

